package threadsAssign3; import java.util.ArrayList; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; public class Server implements Runnable{ private int serverID; private volatile BlockingQueue<Task> blockingQueue; private volatile AtomicInteger waitingTime; private String status = "OFF"; public Server(int serverID) { this.serverID = serverID; blockingQueue = new LinkedBlockingQueue<>(); waitingTime = new AtomicInteger(0); } public String[] getTasks() { String[] result = new String[blockingQueue.size() + 1]; result[0] = String.format("Server #%d - %s", serverID, status); Task[] tasks = new Task[blockingQueue.size()]; blockingQueue.toArray(tasks); for (int i = 0; i < blockingQueue.size(); i++){ result[i + 1] = tasks[i].toString(); } return result; } @Override public void run() { status = "ON"; while (true) { Task task; try { task = blockingQueue.take(); Simulator.computeAverageWaitingTime(task.getArrivalTime()); executeTask(task); } catch (InterruptedException e) { e.printStackTrace(); } } } private synchronized void executeTask(Task task){ try { EventsLog.log(String.format("Stated execution of %s", task.toString())); Thread.sleep(task.getProcessTime() * 1000); waitingTime.addAndGet((-1) * task.getProcessTime()); EventsLog.log(String.format("Ended execution of %s", task.toString())); } catch (InterruptedException e) { e.printStackTrace(); } } public void addTask(Task task) { EventsLog.log(String.format("%s added to server %d", task.toString(), serverID)); blockingQueue.add(task); waitingTime.addAndGet(task.getProcessTime()); } public boolean isEmpty() { return blockingQueue.isEmpty(); } public int getNrOfTasks(){ return blockingQueue.size(); } public boolean hitThreshold() { return getNrOfTasks() >= Simulator.getThreshold(); } public ArrayList<Task> getTasksToMove(int nrOfTasks) { ArrayList<Task> result = new ArrayList<>(); for (int i = 0; i < nrOfTasks; i++) try { Task task = blockingQueue.take(); result.add(task); EventsLog.log(String.format("%s moved from server %d", task.toString(), serverID)); } catch (InterruptedException e) { e.printStackTrace(); } return result; } }